package main

import "fmt"

//定义猫的结构体节点
type CatNode struct {
	no   int
	name string
	next *CatNode
}

func InsertCatNode(head *CatNode, newCatNode *CatNode) {
	//判断是不是第一只猫
	if head.next == nil {
		head.no = newCatNode.no
		head.name = newCatNode.name
		head.next = head //构成一个自己的环形
		fmt.Println(newCatNode, "加入到环形链表")
		return
	}

	//定义一个临时变量，帮忙找到环形的最后节点
	temp := head
	for {
		if temp.next == head {
			break
		}
		temp = temp.next
	}
	//加入到列表中
	temp.next = newCatNode
	newCatNode.next = head
}

//输出这个环形的链表
func ListCircleLink(head *CatNode) {
	temp := head
	if temp.next == nil {
		fmt.Println("环形链表为空")
		return
	}
	for {
		fmt.Printf("id=%d猫的name=%s\n", temp.no, temp.name)
		if temp.next == head {
			break
		}
		temp = temp.next
	}
}

func DelCatNode(head *CatNode, id int) *CatNode {
	temp := head
	helper := head
	// 这是一个空链表
	if temp.next == nil {
		fmt.Println("这是一个空的环形链表，不能删除")
		return head
	}
	//如果只有一个节点
	if temp.next == head {
		temp.next = nil
		return head
	}

	//将helper定位到链表最后
	for {
		if helper.next == head {
			break
		}
		helper = helper.next

	}

	flag := true
	//如果两个，包含两个以上的节点
	for {
		if temp.next == head {
			//如果到这里了，已经比较到最后一个，还没有找到
			break
		}
		if temp.no == id {
			if temp == head {
				head = head.next
			}
			helper.next = temp.next
			fmt.Printf("%d被干掉\n", temp.no)
			flag = false
			break
		}
		helper = temp
		temp = temp.next
		//helper = helper.next //一旦找到了要删除的节点，helper要帮助删除

	}
	//这里还要比较一次
	if flag == true {
		if temp.no == id {
			helper.next = temp.next
			fmt.Printf("%d被干掉\n", temp.no)
		} else {
			fmt.Println("对不起，没有no=", id)
		}
	}
	return head
}

func main() {
	//这里我们初始化一个环形链表的头结点
	head := &CatNode{}

	//创建一个新的猫节点
	cat1 := &CatNode{
		no:   1,
		name: "tom",
	}
	cat2 := &CatNode{
		no:   2,
		name: "tom2",
	}
	cat3 := &CatNode{
		no:   3,
		name: "tom3",
	}
	cat4 := &CatNode{
		no:   4,
		name: "tom4",
	}
	ListCircleLink(head)
	InsertCatNode(head, cat1)
	InsertCatNode(head, cat2)
	InsertCatNode(head, cat3)
	InsertCatNode(head, cat4)
	ListCircleLink(head)
	head = DelCatNode(head, 4)
	ListCircleLink(head)

}
